{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Compare accuracy of four CNN architectures"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this example, we compare accuracy of four CNN architectures:\n",
    "\n",
    "- [AlexNet](https://github.com/BVLC/caffe/tree/master/models/bvlc_alexnet)\n",
    "- [SqueezeNet 1.0](https://github.com/DeepScale/SqueezeNet/tree/master/SqueezeNet_v1.0)\n",
    "- [SqueezeNet 1.1](https://github.com/DeepScale/SqueezeNet/tree/master/SqueezeNet_v1.1)\n",
    "- [GoogleNet](https://github.com/BVLC/caffe/tree/master/models/bvlc_googlenet)\n",
    "\n",
    "on the [Imagenet validation set](http://academictorrents.com/details/5d6d0df7ed81efd49ca99ea4737e0ae5e3a5f2e5) (50,000 images)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The experimental data is stored in the main CK-Caffe repository under '[experiment](https://github.com/dividiti/ck-caffe/tree/master/experiment)'."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Includes"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Collective Knowledge"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CK version: 1.7.4dev\n"
     ]
    }
   ],
   "source": [
    "import ck.kernel as ck\n",
    "print ('CK version: %s' % ck.__version__)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Scientific"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "import IPython as ip\n",
    "import numpy as np\n",
    "import scipy as sp\n",
    "import pandas as pd\n",
    "import matplotlib as mp"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "IPython version: 4.1.1\n",
      "NumPy version: 1.10.4\n",
      "SciPy version: 0.17.0\n",
      "Pandas version: 0.18.0+57.g101d81d.dirty\n",
      "Matplotlib version: 1.5.1\n"
     ]
    }
   ],
   "source": [
    "print ('IPython version: %s' % ip.__version__)\n",
    "print ('NumPy version: %s' % np.__version__)\n",
    "print ('SciPy version: %s' % sp.__version__)\n",
    "print ('Pandas version: %s' % pd.__version__)\n",
    "print ('Matplotlib version: %s' % mp.__version__)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from matplotlib import cm\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Access experimental results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "def get_run_info(tags):\n",
    "    r=ck.access({'action':'get', 'module_uoa':'experiment', 'tags':tags, 'load_json_files':['0001']})\n",
    "    if r['return']>0:\n",
    "        print (\"Error: %s\" % r['error'])\n",
    "        exit(1)\n",
    "    # Assume a single point per the given tags.\n",
    "    point = r['points'][0]\n",
    "    characteristics = point['0001']['characteristics_list']\n",
    "    run_info = characteristics[0]['run']\n",
    "    return run_info"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### AlexNet"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.568279, 0.799501)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "alexnet_tags = 'accuracy,caffemodel,bvlc,alexnet'\n",
    "alexnet_info = get_run_info(alexnet_tags)\n",
    "alexnet_accuracy = (alexnet_info['accuracy'], alexnet_info['accuracy_top5'])\n",
    "alexnet_accuracy"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### SqueezeNet 1.0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.576801, 0.803903)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "squeezenet_1_0_tags = 'accuracy,caffemodel,deepscale,squeezenet-1.0'\n",
    "squeezenet_1_0_info = get_run_info(squeezenet_1_0_tags)\n",
    "squeezenet_1_0_accuracy = (squeezenet_1_0_info['accuracy'], squeezenet_1_0_info['accuracy_top5'])\n",
    "squeezenet_1_0_accuracy"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### SqueezeNet 1.1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.58388, 0.810123)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "squeezenet_1_1_tags = 'accuracy,caffemodel,deepscale,squeezenet-1.1'\n",
    "squeezenet_1_1_info = get_run_info(squeezenet_1_1_tags)\n",
    "squeezenet_1_1_accuracy = (squeezenet_1_1_info['accuracy'], squeezenet_1_1_info['accuracy_top5'])\n",
    "squeezenet_1_1_accuracy"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### GoogleNet"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.689299, 0.891441)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "googlenet_tags = 'accuracy,caffemodel,bvlc,googlenet'\n",
    "googlenet_info = get_run_info(googlenet_tags)\n",
    "googlenet_accuracy = (googlenet_info['loss3/top-1'], googlenet_info['loss3/top-5'])\n",
    "googlenet_accuracy"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Data frame"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th colspan=\"2\" halign=\"left\">Accuracy, %</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th>Top 1</th>\n",
       "      <th>Top 5</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>AlexNet</th>\n",
       "      <td>0.568279</td>\n",
       "      <td>0.799501</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>SqueezeNet 1.0</th>\n",
       "      <td>0.576801</td>\n",
       "      <td>0.803903</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>SqueezeNet 1.1</th>\n",
       "      <td>0.583880</td>\n",
       "      <td>0.810123</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>GoogleNet</th>\n",
       "      <td>0.689299</td>\n",
       "      <td>0.891441</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "               Accuracy, %          \n",
       "                     Top 1     Top 5\n",
       "AlexNet           0.568279  0.799501\n",
       "SqueezeNet 1.0    0.576801  0.803903\n",
       "SqueezeNet 1.1    0.583880  0.810123\n",
       "GoogleNet         0.689299  0.891441"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame(\n",
    "    columns=[['Accuracy, %']*2, ['Top 1', 'Top 5']],\n",
    "    data=[alexnet_accuracy, squeezenet_1_0_accuracy, squeezenet_1_1_accuracy, googlenet_accuracy], \n",
    "    index=['AlexNet', 'SqueezeNet 1.0', 'SqueezeNet 1.1', 'GoogleNet']\n",
    ")\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Plot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0xacfea7f0>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nhm6//fa4bX366aeaNm2aJk6cqLvuuktXXnmlUlNTY7abPn26cnNzNXDgwCpt5+bmavPmzXHbJnE1\nAAAAAACIxsihevDKK6+odevW2rRpkzZs2KANGzbo73//uy666CIVFBRU2Xby5Ml6/PHH9c4770jy\ngkHLli3Tp59+KslLOD1w4EA9+eST+v73v68bbrgh7j47deqk6dOna+7cueFlAwcOVEpKiubOnatD\nhw7p+PHj2rhxo9auXStJ6tatm7Zt2ybnXEOcBqDZY+4+AABoKbhvAdCYWnxwKLtbN5nUYK/sbt1q\n7UNBQYGuu+469ezZUxkZGeHXj370Iz3//PM6fvx4eNuvfvWreuqppzRlyhSlp6erb9++4elnv/vd\n7/T666/r0UcflSTNnz9f69at08KFCyXFjvyZOnWqWrduHV6elJSkpUuXav369erdu7cyMjI0efJk\nlZWVSZJGjhwp55w6d+6sAQMG1OEsAwAAAACAk5U1x1EkZubi9cvMGPWCWnGdoDqFhYX8FQ4AALQI\n3LcAaAj+9+WYnDMtfuQQAAAAAAAAThwjh3DS4ToBAAAAACAWI4cAAAAAAAAQg+AQgMAoLCxs6i4A\nAAAkhPsWAI2J4BAAAAAAAECAkXMIJx2uEwAAAAAAYpFzCAAAAAAAADEIDgEIDObuAwCAloL7FgCN\nieAQAAAAAABAgLX44FBOz0yZWYO9cnpmJtSP1atX68ILL1Rqaqq6dOmiiy66SO+++24DH33DyM/P\nV7t27VRUVBRetnLlSvXu3Tuh+rNnz9a4ceNq3OYXv/iFzj//fLVt21bXXXddrW0uWLBA3bt3V2pq\nqiZNmqSjR48m1BcgUn5+flN3AQAAICHctwBoTK2bugNfVKi4VG5kw7VvL5bWuk15ebmGDRumJ554\nQiNHjtSRI0f0hz/8QW3atGm4jjUgM1NycrLuuecePf7441WW15eePXtq5syZWr58uT777LMat12+\nfLnmzp2rN998U927d9fll1+uO++8U3PmzKm3/gAAAAAAEFQtfuRQc/DBBx/IzDRq1CiZmdq0aaPv\nfOc7OvvssyVJFRUVmj59urp27arTTz9djz76qJKSklRRUSFJ6t27t954441we7Nnz9bYsWPD5bff\nflsXXnih0tLSlJeXp1WrVoXXlZWVadKkSerRo4eysrI0c+bM8JO6+vfvr44dO6pjx45KSUlRUlKS\n3nrrrVrblKSpU6dq4cKF2rp1a9xjLikp0YgRI5SRkaE+ffrokUcekeQFcubMmaPFixcrJSVFeXl5\ncetffvnlGj58uNLT02s9vwUFBZo4caL69eunTp06aebMmXrmmWdqrQdEY+4+AABoKbhvAdCYCA7V\ng759+6pVq1YaP368XnvtNX3yySdV1j/55JNatmyZNmzYoLVr1+qll16qdRRO5fqioiINHTpUs2bN\n0r59+zRv3jxdeeWV2rt3ryTp2muv1amnnqotW7Zo3bp1WrFihZ5++mlJ0vr161VWVqaysjLNnz9f\n/fr103nnnVdrm5I3smfy5MmaNWtWTN+ccxo2bJjy8vJUUlKilStX6qGHHtKKFSs0ZMgQ3XHHHRo9\nerTKy8u1bt26L3RuJWnjxo0699xzw+Vzzz1Xu3bt0r59+75w2wAAAAAABB3BoXqQkpKi1atXKykp\nSddff70yMjJ02WWXaffu3ZKkF198UdOmTVOPHj2Umpqq22+/PeG2n3vuOV166aUaMmSIJOmSSy7R\ngAEDtGzZMu3atUu///3vtWDBArVt21ZdunTRtGnTtHDhwiptrF69WjNnztSSJUuUnJxcY5uRbrvt\nNi1dulSbNm2qsvydd97Rnj17NGPGDLVq1Uo5OTmaNGmSFi1aVOdzl4gDBw6oU6dO4XKnTp3knFN5\neXmD7A8nL+buAwCAloL7FgCNieBQPfnyl7+sX/3qV9q+fbvef/99FRcXa9q0aZKk4uJiZWVlhbfN\nzs5OuN1QKKQXXnhB6enpSk9PV1pamtasWaOSkhKFQiEdPXpU3bt3D6+78cYbtWfPnnD9HTt2aPTo\n0SooKFCfPn1qbHPnzp1V9t2lSxdNmTJFM2fOrLJ8+/btKioqqlL//vvv165du+p83hKRnJyssrKy\ncLmsrExmppSUlAbZHwAAAAAAQdLiE1I3R3379tX48eP15JNPSpK6d++uHTt2hNeHQqEq23fo0EEH\nDx4MlyODNFlZWRo3bpyeeOKJmP3s3LlTbdu21d69e+NOUzt06JCuuOIK3XLLLRo8eHBCbUabPn26\ncnNzNXDgwCr1c3NztXnz5rh16jNxtSSdddZZ2rBhg0aMGCHJmy7XrVs3paWl1et+cPIrLCzkr3AA\nAKBF4L4FQGNi5FA92Lx5s+bPnx9+9PuOHTu0cOFCDRo0SJI0atQoPfzwwyoqKtK+ffv0wAMPVKnf\nv39/LVq0SMeOHQvnJKo0ZswYLVmyRK+//roqKip06NAhrVq1SsXFxcrMzNTgwYN18803q7y8XM45\nbdmyJZx0esKECTrjjDN06623VtlfTW1G69Spk6ZPn665c+eGlw0cOFApKSmaO3euDh06pOPHj2vj\nxo1au3atJKlbt27atm1bODF2PMePHw/XPXbsmA4fPqzjx4/H3XbcuHH65S9/qU2bNumTTz7Rfffd\npwkTJlTbNgAAAAAAqAPnXLN7ed2KFW95do9uTlKDvbJ7dIvbl0hFRUVu1KhRrmfPni45Odn16tXL\n3XTTTa68vNw559yxY8fcLbfc4jp37uxyc3Pdo48+6pKSktzx48edc85t2bLFXXDBBS4lJcUNHTrU\n/eu//qsbO3ZsuP133nnHffOb33Tp6ekuIyPDDR061O3YscM551xZWZm76aabXK9evVxqaqo777zz\n3OLFi51zzpmZ69Chg0tOTnbJyckuJSXFrV69utY2v/Wtb7lf/vKX4f0fOHDAdevWzeXm5oaXlZSU\nuKuvvtplZma69PR0N2jQILdy5UrnnHN79+513/jGN1xaWpr76le/Gvec3XXXXc7MXFJSUvg1e/Zs\n55xz27dvdykpKeH+OOfcggULXLdu3VynTp3cxIkT3ZEjR6p9P6q7fgAAAAAACDL/+3JMHMZcDaM7\nmoqZuXj9MrMaR6O0FKFQSLm5uTp69KiSkhi8Vd9OlusEAAAAAID65H9fjskFQ2SiiRC8ABpfYWFh\nU3cBAAAgIdy3AGhMBIeaSH0nbQYAAAAAADgRTCvDSYfrBAAAAACAWEwrAwAAAAAAQAyCQwACg7n7\nAACgpeC+BUBjIjgEAAAAAAAQYOQcwkmH6wQAAAAAgFjV5Rxq3RSdAQAAAACgLnJyMhUKlTZ1N5qd\n7Oxu2rZtZ1N3Ay0c08oABAZz9wEAQEvBfUusUKhUzolX1IuAGepDiw8O5ZyWKTNrsFfOaZkJ9WP1\n6tW68MILlZqaqi5duuiiiy7Su+++28BH3zDy8/PVrl07FRUVhZetXLlSvXv3Tqj+7NmzNW7cuBq3\n+cUvfqHzzz9fbdu21XXXXVfjths3btR3v/tdde3aVa1atUqoDwAAAAAAIDEtflpZaEep3AsN176N\nqj0KW15ermHDhumJJ57QyJEjdeTIEf3hD39QmzZtGq5jDcjMlJycrHvuuUePP/54leX1pWfPnpo5\nc6aWL1+uzz77rMZtTznlFI0ePVo/+tGPdPnll9dbHxA8+fn5Td0FAACAhHDfAqAxtfiRQ83BBx98\nIDPTqFEDI9i1AAAgAElEQVSjZGZq06aNvvOd7+jss8+WJFVUVGj69Onq2rWrTj/9dD366KNKSkpS\nRUWFJKl379564403wu3Nnj1bY8eODZfffvttXXjhhUpLS1NeXp5WrVoVXldWVqZJkyapR48eysrK\n0syZM8PJmPv376+OHTuqY8eOSklJUVJSkt56661a25SkqVOnauHChdq6dWvcYy4pKdGIESOUkZGh\nPn366JFHHpEkLV++XHPmzNHixYuVkpKivLy8uPUvv/xyDR8+XOnp6bWe3759+2rChAk688wza90W\nAAAAAADUDcGhetC3b1+1atVK48eP12uvvaZPPvmkyvonn3xSy5Yt04YNG7R27Vq99NJLtY7CqVxf\nVFSkoUOHatasWdq3b5/mzZunK6+8Unv37pUkXXvttTr11FO1ZcsWrVu3TitWrNDTTz8tSVq/fr3K\nyspUVlam+fPnq1+/fjrvvPNqbVPyRvZMnjxZs2bNiumbc07Dhg1TXl6eSkpKtHLlSj300ENasWKF\nhgwZojvuuEOjR49WeXm51q1b94XOLVCfmLsPAABaCu5bADQmgkP1ICUlRatXr1ZSUpKuv/56ZWRk\n6LLLLtPu3bslSS+++KKmTZumHj16KDU1VbfffnvCbT/33HO69NJLNWTIEEnSJZdcogEDBmjZsmXa\ntWuXfv/732vBggVq27atunTpomnTpmnhwoVV2li9erVmzpypJUuWKDk5ucY2I912221aunSpNm3a\nVGX5O++8oz179mjGjBlq1aqVcnJyNGnSJC1atKjO5w4AAAAAADQtgkP15Mtf/rJ+9atfafv27Xr/\n/fdVXFysadOmSZKKi4uVlZUV3jY7OzvhdkOhkF544QWlp6crPT1daWlpWrNmjUpKShQKhXT06FF1\n7949vO7GG2/Unj17wvV37Nih0aNHq6CgQH369KmxzZ07qz7+sEuXLpoyZYpmzpxZZfn27dtVVFRU\npf7999+vXbt21fm8AY2JufsAAKCl4L4FQGNq8Qmpm6O+fftq/PjxevLJJyVJ3bt3144dO8LrQ6FQ\nle07dOiggwcPhsuRQZqsrCyNGzdOTzzxRMx+du7cqbZt22rv3r1xp6kdOnRIV1xxhW655RYNHjw4\n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\nAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xacfdcf70>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "df['Accuracy, %'].T \\\n",
    "    .plot(title='Prediction accuracy on the ImageNet validation set (50,000 images)',\n",
    "          kind='bar', rot=0, ylim=[0,1], figsize=[20, 8], grid=True, legend=True, colormap=cm.autumn, fontsize=16)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
